1. PULIZIA DEI DATI

Questo dataset contiene circa 900.000 prestiti garantiti (anche solo in parte) dalla SBA.
La SBA (Small Business Administration) è un'agenzia governativa che offre supporto alle PMI statunitensi, offrendo prestiti attraverso banche locali, garantiti fino ad un massimo del 90%. Questo consente alle piccole imprese di accedere a risorse offerte da banche locali, con quest'ultime che vedono diminuito il rischio di credito grazie alle garanzie della SBA.

Le colonne raccolgono le seguenti informazioni:

LoanNr_ChkDgt - L'identificativo di ciascun prestito
Name - Il nome del debitore
City - La città del debitore
State - Lo stato di residenza del debitore
Zip - Lo ZipCode del debitore
Bank - Nome della banca
BankState - Lo stato in cui ha sede la banca
NAICS - Sistema di classificazione delle aziende americane (Le prime due cifre indicano il settore)
ApprovalDate - Data di approvazione da parte del SBA
ApprovalFY - Anno fiscale di approvazione
Term - Duration in mesi
NoEmp - Numero di dipendenti dell'azienda richiedente
NewExist - Indica se l'azienda è già esistente oppure se è nel suo primo anno di vita (1 = esistente,2 = nuova)
CreateJob - Posti di lavoro creati dall'azienda
RetainedJob - Posti di lavoro mantenuti
FranchiseCode - Codice Franchise (00000 o 00001 = No Franchise)
UrbanRural - Indica dove è localizzata l'impresa (1 = Città, 2 = Provincia, 0 = Indefinito)
RevLineCR - Indica una linea di credito 'revolving' (Y = Si, N = No)
LowDoc - Indica un prestito 'LowDoc' (Prestito di entità minore, Y = Si, N = No)
ChgOffDate - Data in cui un prestito è diventato inesigibile
DisbursementDate - Data rimborso del prestito
DisbursementGross - Ammontare del rimborso
BalanceGross - Importo residuo
MIS_Status - Stato del prestito (CHGOFF = inesigibile, PIF = Rimborsato)
ChgOffPrinGr - Ammontare non riscosso
GrAppv - Ammontare del prestito accordato dalla banca
SBA_Appv - Ammontare garantito da SBA

Le colonne: 'Name, 'Bank', 'BankState', 'ChgOffDate' presentano un alto numero di valori null. Non sono utili alla nostra indagine quindi possono essere tranquillamente eliminate dal df.

La feature NAICS indica, nelle prime due cifre, il settore in cui opera l'azienda. Quindi le recuperiamo, eliminando i valori NULL
Rinominiamo poi la feature in un più comprensibile 'IndustryType', sostituendo i codici con il nome del settore

La feature MIS_Status comprende due diversi valori: PIF = Paid in Full, CHGOFF = Loan Status Charged off
Per comodità rinominiamo la colonna 'MIS_Status' in 'Default' e convertiamo i valori con una logica binaria: 0 per i prestiti PIF e 1 per i prestiti CHGOFF

ApprovalFY, DisbursementGross, BalanceGross, ChgOffPrinGr, GrAppv, SBA_Appv sono una serie di colonne di tipo 'object' nonostante dovrebbero contenere dei numeri

Queste ultime 5 colonne non possono essere convertite in float finchè conterranno caratteri come '$' o le virgole come separatori. Scriviamo una funzione per pulire i dati e convertirli in float.

Non riusciamo a formattare 'RevLineCr' e 'LowDoc' come int. Proviamo ad indagare

Queste due colonne presentano diversi errori di Data Entry. Dobbiamo eliminarli.

'DisbursementDate' dovrebbe essere di tipo datetime, inoltre ci interessa soltanto l'anno.

Voglio aggiungere due features al dataframe:
Una chiamata 'Recession'. Sarà una variabile binaria che indicherà se nel lasso di tempo in cui il prestito andava rimborsato, la nazione si trovasse negli anni della recessione 2007-2009.
Un'altra chiamata 'Real Estate' in cui segnalare se un prestito è garantito da valori immobiliari. Solitamente questo è il caso di prestiti a lungo termine (>20 anni) e hanno una probabilità di default minore, ragione per il quale è ragionevole considerarla una feature utile.

Nel dataset viene indicato l'ammontare del prestito garantito da SBA, ma sarebbe più utile rappresentarlo come percentuale rispetto al totale.

Adesso possiamo completare la fase di analisi e pulizia eliminando le colonne che non ci serviranno nelle fasi successive:

LoanNr_ChkDgt - Non abbiamo interesse nello studiare l'ID
City e Zip - A livello geografico siamo interessati solo alla feature State
ApprovalDate - si ritiene sia più utile la feature ApprovalFY
SBA_Appv - si ritiene sia più utile fare riferimento alla percentuale garantita da SBA

Dopo la prima fase di pulizia nel nostro dataframe possiamo contare su 688.603 entries per 19 features

2. ANALISI DEI DATI

Ora che il df è pulito possiamo effettuare un'analisi superficiale

Emerge che:

Ripuliamo le feautures che sembrano contenere degli outliers

Raccogliamo delle informazioni aggiuntive:

3. DATA VISUALIZATION

Attraverso un grafico rappresentiamo la distribuzione dei default tra i 51 stati americani

Adesso andiamo a rappresentare la media dei default e la percentuale della quota garantita da SBA per ogni tipologia di aziende

Emerge come i settori più "solidi" siano imprese del settore primario come Agricoltura/Pesca/Caccia o quello minerario, al contrario di servizi come quello Assicurativo che presenta la percentuale di default più alta.

Per quanto riguarda la quota di prestito garantito da SBA, possiamo ritenere che in media la forbice vada da un minimo del 60% a circa il 75%.

Consideriamo ora gli anni della recessione e andiamo a verificarne gli effetti sulla percentuale di default e quota garantita da SBA

Contrariamente a quanto potrebbe aspettarsi, la recessione sembra aver avuto un effetto marginale sia sulla quota di prestiti garantita da SBA sia sulla percentuale di prestiti in default, infatti:

3. MACHINE LEARNING

Sebbene l'accuracy del modello logistico sia al 85%, l'F1-score non è buono.
Infatti la precision ci suggerisce che l'algoritmo è corretto il 71% delle volte quando un prestito è in default, ma secondo l'indice 'recall' solo il 43% delle volte l'algoritmo riconosce un debito in default correttamente, significa quindi che il 57% di prestiti in default sono stati considerati come saldati. Non è consigliabile usare questo modello.

Il modello XGBoost offre risultati decisamente migliori.
L'accuracy sale a circa il 95% mentre l'F1-score è al 86%. Nello specifico l'algoritmo è corretto quasi l'88% delle volte quando un prestito è in default, inoltre la percentuale di prestiti in default considerati come saldati scende al 15% (era il 57% per il modello logistico).

SMOTE è un algoritmo che permette di bilanciare le classi, proviamolo insieme all'algoritmo XGBoost

Processare i nostri dati attraverso l'algoritmo SMOTE si è rivelata una decisione "costosa" in termini di tempi di esecuzione ma a giudicare dal report ha decisamente migliorato la bontà della nostra analisi.
Se l'accuracy resta buona, il nostro f1-score migliora di ben 10 punti percentuali.
La precision passa dal 87% al 96% e l'indice recall passa dal circa 86% al 96%. Questo significa che se prima il 15% dei prestiti default veniva considerato come saldato, la percentuale ora si è abbassaa al 3,5% (eravamo partiti dal 57% del modello logistico!) A questo punto ci si può dire soddisfatti del lavoro svolto.